
#include "server_Personaje.h"
#include "server_Coordenada.h"
#include <map>
#include <string>

#define CALL_MEMBER_FN(object, ptrToMember) ((object).*(ptrToMember))

using std::map;
using std::string;
typedef void (Coordenada::*metodo_t) ();

Personaje::Personaje() {
    vive = true;
    movimientos["arriba"] = &Coordenada::incrementarY;
    movimientos["derecha"] = &Coordenada::incrementarX;
    movimientos["izquierda"] = &Coordenada::decrementarX;
    movimientos["abajo"] = &Coordenada::decrementarY;
}

Personaje::~Personaje() {
}

bool Personaje::estaVivo() {
    return vive;
}

void Personaje::setDireccion(string dir) {
    direccion = dir;
}

void Personaje::mover() {
    /* COMPLETAR. */
    if ((movimientos.count(direccion) > 0) && (direccion != "ninguna")) {
        posicionAnterior = posicion;
        CALL_MEMBER_FN(posicion, movimientos[direccion]) ();
    }
    direccion = "ninguna";
}

void Personaje::retroceder() {
    posicion = posicionAnterior;
}

void Personaje::ubicar(Coordenada coord) {
    posicion = coord;
}

void Personaje::destruir() {
    vive = false;
}

Coordenada Personaje::getPosicion() {
    return posicion;
}

void Personaje::colisionarConBombaPlanta() {
    //depende del personaje
}

void Personaje::colisionarConBomberman(IOcupante* bomberman) {
    //No pasa nada
}

void Personaje::colisionarConEnemigo() {
    //No pasa nada excepto que se trate de un Bomberman.
}

void Personaje::colisionarConPlanta() {
    //No pasa nada.
}

string Personaje::serializar() {
    return codigo;
}


